import axios from 'axios';
import Loading from '../layout/loading/loading'
axios.defaults.baseURL = '/api';
axios.defaults.timeout = 5000;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
    let cancelToken = axios.CancelToken;
    let removePending = (ever) => {
        for(let p in pending){
            if(pending[p].u === ever.url + '&' + ever.method) { //当当前请求在数组中存在时执行函数体
                pending[p].f(); //执行取消操作
                pending.splice(p, 1); //把这条记录从数组中移除
            }
        }
        // console.log('取消请求了！！')
    }
// 请求前拦截
axios.interceptors.request.use(

    config => {
        removePending(config); //在一个ajax发送前执行一下取消操作
      config.cancelToken = new cancelToken((c)=>{
         // 这里的ajax标识我是用请求地址&请求方式拼接的字符串，当然你可以选择其他的一些方式
         pending.push({ u: config.url + '&' + config.method, f: c });  
      });
        const token = localStorage.getItem("token");
        if (token) {
            // 判断是否存在token，如果存在的话，则每个http header都加上token
            config.headers['token'] = token;
        }
        Loading.show();
        // console.log(config)
        return config;

    },
    err => {
        alert("请求超时");
        return Promise.reject(err);
    }
);

// 返回后拦截
axios.interceptors.response.use(
    data => {
        // 请求状态判断
        // 请求结束后将对应存储的取消函数删除
        removePending(data.config)
        Loading.remove();

        return Promise.resolve(data);

        // if (data.status === 200) {

        //     let res = data;
        //     return Promise.resolve(res);

        // } else {
        //     return Promise.resolve(data);
        // }


    },
    err => {
        alert(err)
        return Promise.reject(err);
    }
);
let http = { post: '' };
http.post = function (url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.post(url, data).then((res) => {
            resolve(res.data);
        }).catch((res) => {
            reject(res);
        });
    });
}
http.get = function (url, data = {}) {
    return new Promise((resolve, reject) => {
        axios.get(url, { params: { data } }).then((res) => {
            resolve(res.data);
        }).catch((res) => {
            reject(res);
        });
    });
}
export default http